package com.xl.utils.excel.handler;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.xl.utils.str.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.util.Map;

/**
 * 主要用于解决模板导出后，输入某几列的数据是类型为字符，防止输入001 变为1
 */
public class MySheetWriteHandler implements SheetWriteHandler {

    /**
     * 那几列的输入为字符类型，从0开始
     */
    private Integer[] useStringColunms;

    /**
     * 下拉数据，如果要设置sheet的某几列的下拉数据，将数据封装到该map中
     * k: 列的索引，从0开始
     * v: 下拉数据数组
     */
    private Map<Integer, String[]> dropDownData;

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        //sheet
        Sheet sheet = writeSheetHolder.getSheet();

        if (StringUtils.isNotEmpty(useStringColunms)) {
            //遍历每一列设置每一列的内容格式
            for (Integer useStringColunm : useStringColunms) {
                CellStyle cellStyle = writeWorkbookHolder.getWorkbook().createCellStyle();
                cellStyle.setDataFormat((short) 49);//49表示是字符类型
                sheet.setDefaultColumnStyle(useStringColunm, cellStyle);
            }
        }

        //为某几列设置下拉数据
        if (StringUtils.isNotEmpty(dropDownData)) {
            DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
            //为某一列设置下拉数据
            dropDownData.forEach((columnIndex, datas) -> {
                //这里划定了一个区域，1=表示第二行，不含表头 .   65535=表示最长65535行， 起始列和终止列相同，表示就是一列
                //这个区域就表示某一列的 第二行-65535行
                CellRangeAddressList cellAddressesList = new CellRangeAddressList(1, 65535, columnIndex, columnIndex);
                //给这个区域里面的单元格设置下拉数据
                DataValidationConstraint constraint = dataValidationHelper.createExplicitListConstraint(datas);
                DataValidation validation = dataValidationHelper.createValidation(constraint, cellAddressesList);
                validation.createErrorBox("提示", "请选择下拉框里的数据!");
                validation.setShowErrorBox(true);
                validation.setSuppressDropDownArrow(true);
                sheet.addValidationData(validation);
            });
        }

    }

    public void setUseStringColunms(Integer[] useStringColunms) {
        this.useStringColunms = useStringColunms;
    }

    public void setDropDownData(Map<Integer, String[]> dropDownData) {
        this.dropDownData = dropDownData;
    }
}
